/**
 * APP Bridge 业务方法封装
 * 封装与原生 APP 交互的具体业务方法
 */

import { callAppHandler, registerH5Handler, isInApp } from './jsBridge.js';

/**
 * 调用 APP 登录
 * @param {Object} options - 登录参数
 * @returns {Promise}
 */
export function callAppLogin(options = {}) {
    
    const loginData = {
        source: 'h5',
        timestamp: Date.now(),
        userAgent: navigator.userAgent,
        ...options
    };
    
    console.log('[AppBridge] 调用 APP 登录:', loginData);
    console.log('[AppBridge] Bridge 状态:', window.WebViewJavascriptBridge ? '已初始化' : '未初始化');
    
    // 超时时间设置为 5 分钟（300000 毫秒）
    return callAppHandler('loginAction', loginData, 300000)
        .then(response => {
            console.log('[AppBridge] 登录成功:', response);
            return response;
        })
        .catch(error => {
            console.error('[AppBridge] 登录失败:', error);
            console.error('[AppBridge] 错误详情:', error.message);
            throw error;
        });
}

/**
 * 注册登录回调（供 APP 调用）
 * @param {Function} callback - 回调函数
 */
export function registerLoginCallback(callback) {
    registerH5Handler('h5LoginCallback', (data, responseCallback) => {
        console.log('[AppBridge] 收到 APP 登录回调:', data);
        
        // 执行业务回调
        if (typeof callback === 'function') {
            callback(data);
        }
        
        // 回复 APP
        if (responseCallback) {
            responseCallback({
                status: 'success',
                message: 'H5 已收到登录回调',
                timestamp: Date.now()
            });
        }
    });
}

/**
 * 获取 APP 用户信息
 * @returns {Promise}
 */
export function getAppUserInfo() {
    console.log('[AppBridge] 获取 APP 用户信息');
    
    return callAppHandler('getUserInfo')
        .then(response => {
            console.log('[AppBridge] 用户信息:', response);
            return response;
        })
        .catch(error => {
            console.error('[AppBridge] 获取用户信息失败:', error);
            throw error;
        });
}

/**
 * 调用 APP 分享
 * @param {Object} shareData - 分享数据
 * @param {String} shareData.title - 分享标题
 * @param {String} shareData.content - 分享内容
 * @param {String} shareData.url - 分享链接
 * @param {String} shareData.imageUrl - 分享图片
 * @returns {Promise}
 */
export function callAppShare(shareData) {
    console.log('[AppBridge] 调用 APP 分享:', shareData);
    
    return callAppHandler('shareAction', shareData)
        .then(response => {
            console.log('[AppBridge] 分享成功:', response);
            return response;
        })
        .catch(error => {
            console.error('[AppBridge] 分享失败:', error);
            throw error;
        });
}

/**
 * 调用 APP 支付
 * @param {Object} payData - 支付数据
 * @param {String} payData.orderId - 订单ID
 * @param {Number} payData.amount - 支付金额
 * @param {String} payData.payType - 支付类型
 * @returns {Promise}
 */
export function callAppPay(payData) {
    console.log('[AppBridge] 调用 APP 支付:', payData);
    
    return callAppHandler('payAction', payData)
        .then(response => {
            console.log('[AppBridge] 支付成功:', response);
            return response;
        })
        .catch(error => {
            console.error('[AppBridge] 支付失败:', error);
            throw error;
        });
}

/**
 * 关闭 APP WebView
 */
export function closeAppWebView() {
    console.log('[AppBridge] 关闭 WebView');
    
    return callAppHandler('closeWebView')
        .catch(error => {
            console.error('[AppBridge] 关闭 WebView 失败:', error);
        });
}

/**
 * 设置 APP 导航栏标题
 * @param {String} title - 标题
 */
export function setAppTitle(title) {
    console.log('[AppBridge] 设置标题:', title);
    
    return callAppHandler('setTitle', { title })
        .catch(error => {
            console.error('[AppBridge] 设置标题失败:', error);
        });
}

/**
 * 调用 APP 拍照/选择图片
 * @param {Object} options - 选项
 * @param {Number} options.maxCount - 最大选择数量
 * @param {Boolean} options.allowCamera - 是否允许拍照
 * @returns {Promise}
 */
export function callAppChooseImage(options = {}) {
    const defaultOptions = {
        maxCount: 9,
        allowCamera: true,
        ...options
    };
    
    console.log('[AppBridge] 选择图片:', defaultOptions);
    
    return callAppHandler('chooseImage', defaultOptions)
        .then(response => {
            console.log('[AppBridge] 图片选择成功:', response);
            return response;
        })
        .catch(error => {
            console.error('[AppBridge] 图片选择失败:', error);
            throw error;
        });
}

/**
 * 获取 APP 定位信息
 * @returns {Promise}
 */
export function getAppLocation() {
    console.log('[AppBridge] 获取定位');
    
    return callAppHandler('getLocation')
        .then(response => {
            console.log('[AppBridge] 定位成功:', response);
            return response;
        })
        .catch(error => {
            console.error('[AppBridge] 定位失败:', error);
            throw error;
        });
}

/**
 * 检测是否在 APP 环境中
 * @returns {Boolean}
 */
export function checkIsInApp() {
    const inApp = isInApp();
    
    // 如果在 APP 中，加载 VConsole
    if (inApp && !window.vConsole) {
        loadVConsole();
    }
    
    return inApp;
}

/**
 * 动态加载 VConsole
 */
function loadVConsole() {
    try {
        // 创建 script 标签加载 VConsole
        const script = document.createElement('script');
        script.src = 'https://unpkg.com/vconsole@latest/dist/vconsole.min.js';
        script.onload = function() {
            if (window.VConsole) {
                window.vConsole = new window.VConsole();
                console.log('[AppBridge] VConsole 已加载');
            }
        };
        script.onerror = function() {
            console.error('[AppBridge] VConsole 加载失败');
        };
        document.head.appendChild(script);
    } catch (error) {
        console.error('[AppBridge] 加载 VConsole 出错:', error);
    }
}

// 导出所有方法
export default {
    callAppLogin,
    registerLoginCallback,
    getAppUserInfo,
    callAppShare,
    callAppPay,
    closeAppWebView,
    setAppTitle,
    callAppChooseImage,
    getAppLocation,
    checkIsInApp
};
